/**
 *  N个人围成若干圈，每个人都有两个邻居，如果两个人成圈，则每个人只有一个邻居
 * 现在给出每个人的其中一个邻居，问最少与最多可能的圈是多少
 * 如果从i到到邻居建一条边，则每个点有且只有一条出边，所以是内向基环树
 * 但实际上更特殊。
 * 要么是两人成环，有零到二条链指向该环。
 * 要么是多人环，必然没有入链。
 * 所有两人环可以分开成圈，也可以成一个圈，由此得到最少与最多。
 * 多人环必须每环一圈。
 * 首先判链，入度为0的点必然是链的起点，然后使用并查集识别两链是否指向同一个二人环
 * 然后判环，将多人环的数量记下来，记作t3，且将所有点与N+1合并
 * 再然后看剩下的点有多少个二人环，利用并查集查看即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

struct uf_t{
vi father;
void init(int n){father.assign(n+1, 0);for(int i=1;i<=n;++i)father[i]=i;}
int find(int x){return father[x]==x?x:father[x]=find(father[x]);}
void unite(int x, int y){father[find(y)] = find(x);}
}UF;

int N, M;
vi A;
vvi G;
vi D;

array<int, 2> proc(){
    G.assign(N + 1, {});
    D.assign(N + 1, 0);
    UF.init(N + 1);
    for(int i=1;i<=N;++i){
        G[i].push_back(A[i]);
        ++D[A[i]];
    }

    vi flag(N + 1, 0);
    for(int i=1;i<=N;++i){
        if(flag[i]) continue;

        if(0 == D[i]){
            int t = i;            
            do{
                flag[t] = 1;
                UF.unite(i, t = G[t][0]);         
            }while(0 == flag[t]);       
        }
    }

    int t3 = 0;
    for(int i=1;i<=N;++i){
        if(flag[i]) continue;

        int c = 0;
        for(int j=i;0==flag[j];j=G[j][0]){
            flag[j] = 1;
            ++c;
            UF.unite(i, j);
        }
        if(c > 2){
            ++t3; UF.unite(i, N + 1);
        }
    }

    int t2 = 0;
    for(int i=1;i<=N;++i)if(UF.find(i)==i and UF.find(i)!=UF.find(N+1))++t2;

    return {t2 ? t3 + 1 : t3, t2 + t3};
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N;
        A.assign(N + 1, 0);
        for(int i=1;i<=N;++i) cin >> A[i];
        auto ans = proc();
        cout << ans[0] << " " << ans[1] << endl;
    }
    return 0;
}